package com.platform.api;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Validator;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jfinal.aop.Duang;
import com.jfinal.kit.HashKit;
import com.jfinal.kit.Prop;
import com.jfinal.weixin.sdk.api.*;
import com.jfinal.wxaapp.api.WxaTemplate;
import com.jfinal.wxaapp.api.WxaTemplateApi;
import com.platform.annotation.IgnoreAuth;
import com.platform.entity.OrderGoodsVo;
import com.platform.util.ApiBaseAction;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import static com.platform.config.Constants.PurchaseSuccessNotice;
import static com.platform.util.CommonUtil.getProp;
import static com.platform.util.wechat.WechatUtil.setWxaConfig;

@RestController
@RequestMapping("/api/weixin")
public class ApiWeixinController extends ApiBaseAction {

    static Prop prop = getProp();
    String appid = prop.get("appId");

    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }

    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }

    /**
     * 如果要支持多公众账号，只需要在此返回各个公众号对应的  ApiConfig 对象即可
     * 可以通过在请求 url 中挂参数来动态从数据库中获取 ApiConfig 属性值
     */
    public ApiConfig getApiConfig() {
        ApiConfig ac = new ApiConfig();

        // 配置微信 API 相关常量
        ac.setToken(prop.get("token"));
        ac.setAppId(prop.get("appId"));
        ac.setAppSecret(prop.get("appSecret"));
        /**
         * 是否对消息进行加密，对应于微信平台的消息加解密方式： 1：true进行加密且必须配置 encodingAesKey
         * 2：false采用明文模式，同时也支持混合模式
         */
        ac.setEncryptMessage(prop.getBoolean("encryptMessage", false));
        ac.setEncodingAesKey(prop.get("encodingAesKey", "setting it in config file"));
        return ac;
    }

    @RequestMapping("sendWxMsg")
    @IgnoreAuth
    public Object sendWxMsg(@RequestParam String FormId, @RequestParam String openId, @RequestParam String keyword1, @RequestParam String keyword2, @RequestParam String keyword3, @RequestParam String keyword4, @RequestParam String keyword5) {
        setWxaConfig();//小程序配置信息
        WxaTemplateApi wxaTemplateApi = Duang.duang(WxaTemplateApi.class);
        WxaTemplate template = new WxaTemplate();
        template.setForm_id(FormId);//支付的prepay_id
        template.setTouser(openId);//接收者（用户）的 openid
        template.setTemplate_id(PurchaseSuccessNotice);//购买成功通知的模板ID
        template.setPage("pages/orderDetail/orderDetail?orderId=");//小程序调转的页面
        template.add("keyword1", keyword1);//购买时间
        template.add("keyword2", keyword2);//物品名称
        template.add("keyword3", keyword3);//购买价格
        template.add("keyword4", keyword4);//订单总价
        template.add("keyword5", keyword5);//订单号
        String build = template.build();
        ApiResult send = wxaTemplateApi.send(build);
        send.getErrorCode();

        return toResponsSuccess(send);
    }


    @RequestMapping("config")
    @IgnoreAuth
    public Object config(String url, HttpServletRequest request) {
        ApiConfigKit.putApiConfig(getApiConfig());

        JsTicket jsApiTicket = JsTicketApi.getTicket(JsTicketApi.JsApiType.jsapi);
        String jsapi_ticket = jsApiTicket.getTicket();
        String nonce_str = create_nonce_str();
        // 注意 URL 一定要动态获取，不能 hardcode.
        if (Validator.isEmpty(url)) {
            url = "http://" + request.getServerName() // 服务器地址
                    // + ":"
                    // + getRequest().getServerPort() //端口号
                    + request.getContextPath() // 项目名称
                    + request.getServletPath();// 请求页面或其他地址
            String qs = request.getQueryString(); // 参数
            if (qs != null) {
                url = url + "?" + (request.getQueryString());
            }
        }

        String timestamp = create_timestamp();
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        // 注意这里参数名必须全部小写，且必须有序
        String str = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "&timestamp=" + timestamp + "&url="
                + url;

        String signature = HashKit.sha1(str);

        Map<String, Object> item = new HashMap<String, Object>();

        item.put("appId", appid);
        item.put("nonceStr", nonce_str);
        item.put("timestamp", timestamp);
        item.put("url", url);
        item.put("signature", signature);
        item.put("jsapi_ticket", jsapi_ticket);

        return toResponsSuccess(item);

    }
}
